broadway: Keep track of surface owner and only send input to that client
authorAlexander Larsson <alexl@redhat.com>
Fri, 29 Mar 2019 10:07:04 +0000 (11:07 +0100)
committerAlexander Larsson <alexl@redhat.com>
Fri, 29 Mar 2019 13:30:13 +0000 (14:30 +0100)
gdk/broadway/broadway-server.c
gdk/broadway/broadway-server.h
gdk/broadway/broadwayd.c

index b8bfe8b1d0ed2c28997d11a9b7e136d73f33f7c5..dc6f965db0fdee7bfa5b6acf128ac8be5b35ac90 100644 (file)
@@ -115,6 +115,7 @@ struct BroadwayInput {
 };
 
 struct BroadwaySurface {
+  guint32 owner;
   gint32 id;
   gint32 x;
   gint32 y;
@@ -471,9 +472,46 @@ process_input_message (BroadwayServer *server,
                        BroadwayInputMsg *message)
 {
   gint32 client;
+  BroadwaySurface *surface;
 
   update_event_state (server, message);
-  client = -1;
+
+
+  switch (message->base.type) {
+  case BROADWAY_EVENT_ENTER:
+  case BROADWAY_EVENT_LEAVE:
+  case BROADWAY_EVENT_POINTER_MOVE:
+  case BROADWAY_EVENT_BUTTON_PRESS:
+  case BROADWAY_EVENT_BUTTON_RELEASE:
+  case BROADWAY_EVENT_SCROLL:
+  case BROADWAY_EVENT_GRAB_NOTIFY:
+  case BROADWAY_EVENT_UNGRAB_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->pointer.event_surface_id);
+    break;
+  case BROADWAY_EVENT_TOUCH:
+    surface = broadway_server_lookup_surface (server, message->touch.event_surface_id);
+    break;
+  case BROADWAY_EVENT_CONFIGURE_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->configure_notify.id);
+    break;
+  case BROADWAY_EVENT_ROUNDTRIP_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->roundtrip_notify.id);
+    break;
+  case BROADWAY_EVENT_KEY_PRESS:
+  case BROADWAY_EVENT_KEY_RELEASE:
+    /* TODO: Send to keys focused clients only... */
+  case BROADWAY_EVENT_FOCUS:
+  case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
+  default:
+    surface = NULL;
+    break;
+  }
+
+  if (surface)
+    client = surface->owner;
+  else
+    client = -1;
+
   if (is_pointer_event (message) &&
       server->pointer_grab_surface_id != -1)
     client = server->pointer_grab_client_id;
@@ -2020,6 +2058,7 @@ broadway_server_ungrab_pointer (BroadwayServer *server,
 
 guint32
 broadway_server_new_surface (BroadwayServer *server,
+                             guint32 client,
                              int x,
                              int y,
                              int width,
@@ -2029,6 +2068,7 @@ broadway_server_new_surface (BroadwayServer *server,
   BroadwaySurface *surface;
 
   surface = g_new0 (BroadwaySurface, 1);
+  surface->owner = client;
   surface->id = server->id_counter++;
   surface->x = x;
   surface->y = y;
index 859464aa459d89541294bb43865f90a19a0db8e0..f11e9e872df84021571bc663b0ec9ba5885d7d41 100644 (file)
@@ -86,6 +86,7 @@ gint32              broadway_server_get_mouse_surface         (BroadwayServer  *
 void                broadway_server_set_show_keyboard         (BroadwayServer  *server,
                                                                gboolean         show);
 guint32             broadway_server_new_surface               (BroadwayServer  *server,
+                                                               guint32          client,
                                                                int              x,
                                                                int              y,
                                                                int              width,
index a3b402f1f603b3765d3959fd596fd6c310c104de..54d97c5ec108d1d4248a29f7a735cb92624229c1 100644 (file)
@@ -234,7 +234,7 @@ client_handle_request (BroadwayClient *client,
     {
     case BROADWAY_REQUEST_NEW_SURFACE:
       reply_new_surface.id =
-        broadway_server_new_surface (server,
+        broadway_server_new_surface (server, client->id,
                                      request->new_surface.x,
                                      request->new_surface.y,
                                      request->new_surface.width,